﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using Enums;
using Vallejos.Entidades.Enums;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Negocio;

public partial class Productos_Navegacion_DeltalleProductos : System.Web.UI.Page
{
    private const string PaginaDeBusqueda = "BusquedaProductos.aspx";

    #region Eventos
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (!String.IsNullOrEmpty(Request.QueryString["idProducto"]))
            {
                var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

                var producto = negocio.LeerProducto(Convert.ToInt32(Request.QueryString["idProducto"]));

                negocio.AlmacenarEntidadEnEdicion(producto);
                

                if (producto != null)
                    CargarProducto(producto);
            }

            CargarTiposFinanciacion();
        }

    }

    
    protected void btnVolver_Click(object sender, EventArgs e)
    {
        Response.Redirect(String.Format("{0}.aspx",Request.QueryString.Get("Desde")));
    }

    protected void btnAceptarConsulta_Click(object sender, EventArgs e)
    {
        var negocio = (NegocioFacade)HttpContext.Current.Session[VariablesDeSesion.NegocioFacade.ToString()];

        var consulta = new Consulta
        {
            Pregunta = txtConsulta.Text
            ,
            EsPublica = rbPublica.Checked
            ,
            Producto = negocio.RecuperarEntidadEnEdicion<Producto>()
        };

        pnlConsultar_ModalPopupExtender.Hide();

        if(negocio.Persona == null)
        {
            Session.Add(VariablesDeSesion.ConsultaActiva.ToString(), consulta);
            pnlAutenticacion_ModalPopupExtender.Show();
        }
        else{
            consulta.Cliente = (Cliente)negocio.Persona;
            RealizarConsulta(consulta);
        }

        txtConsulta.Text = string.Empty;
        rbPublica.Checked = true;
        rbPrivada.Checked = false;
    }

    private bool RealizarConsulta()
    {
        var consulta = (Consulta) Session[VariablesDeSesion.ConsultaActiva.ToString()];
        var consultaActiva = consulta != null;

        if (consultaActiva)
        {
            var negocio = (NegocioFacade)HttpContext.Current.Session[VariablesDeSesion.NegocioFacade.ToString()];
            consulta.Cliente = (Cliente)negocio.Persona;
            RealizarConsulta(consulta);
            Session.Add(VariablesDeSesion.ConsultaActiva.ToString(), null);
        }



        return consultaActiva;
    }

    private bool RealizarConsulta(Consulta consulta)
    {
        var negocio = (NegocioFacade)HttpContext.Current.Session[VariablesDeSesion.NegocioFacade.ToString()];
        negocio.RealizarConsulta(consulta);
        CargarConsultas(negocio.LeerConsultasDeProducto(negocio.RecuperarEntidadEnEdicion<Producto>().Id));

        return true;
    }



    protected void btnAceptarConfirmaCompraFinal_Click(object sender, EventArgs e)
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        if (negocio.Persona != null)
            txtUsuario.Text = negocio.Persona.Usuario.Login;

        var producto = negocio.LeerProducto(Convert.ToInt32(Request.QueryString["idProducto"]));

        var precio = producto.Precio / 100;
        var porcentaje = Convert.ToInt32(txtSlider.Text);
        var montoFinanciado = precio*porcentaje;

        var solicitud = new SolicitudDeAnalisisCrediticio
                            {
                                CFT = 1, //TODO: Modificar producto para q tome el CFT
                                TNA = 1, //TODO: Modificar producto para q tome el TNA
                                Estado = new EstadoDeAnalisis {idEstado = IdEstadoAnalisis.AnalisisAutomatico},
                                CantidadDeCuotas = Convert.ToInt32(txtCantCuotas.Text),
                                Monto = montoFinanciado,
                                Producto = producto,
                                TipoFinanciacion = new TipoFinanciacion { idTipo = (IdTipoFinanciacion)ddlFinanciacion.SelectedIndex, Nombre = ddlFinanciacion.Text} 
                            };

        Session.Add(VariablesDeSesion.SolicitudActiva.ToString(), solicitud);

        pnlConfirmacionFinalCompra_ModalPopupExtender.Hide();
        pnlAutenticacion_ModalPopupExtender.Show();
    }

    protected void btnAceptarConfirmaCompra_Click(object sender, EventArgs e)
    {
        lblModoFinanciacion.Text = ddlFinanciacion.Text;
        lblPorcentajeFinanciar.Text = txtSlider.Text;
        lblMontoFinanciarFinal.Text = lblMontoFinanciar.Text;
        lblAbonandoEfectivo.Text = lblMontoAbonoEfectivo.Text;
        lblCantidadCuotas.Text = txtCantCuotas.Text;
        

        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        var producto = negocio.LeerProducto(Convert.ToInt32(Request.QueryString["idProducto"]));

        var precio = producto.Precio / 100;
        var porcentaje = Convert.ToInt32(txtSlider.Text);

        var resultado = precio * porcentaje;

        lblMontoCuota.Text = String.Format("{0:C}", resultado / Convert.ToInt32(txtCantCuotas.Text));

        pnlConfirmacionCompra_ModalPopupExtender.Hide();
        pnlConfirmacionFinalCompra_ModalPopupExtender.Show();
    }

    protected void btnAceptarAutentica_Click(object sender, EventArgs e)
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

        try
        {
            negocio.Autenticar(new Usuario() { Login = txtUsuario.Text, Password = txtContrasenia.Text });

            lblAutenticacionIncorrecta.Visible = false;

            if (!RealizarConsulta())
            {
                IniciarSolicitud();
            }

            pnlAutenticacion_ModalPopupExtender.Hide();
            
        }
        catch (Exception)
        {

            lblAutenticacionIncorrecta.Visible = true;
        }
    }

    protected void txtSlider_TextChanged(object sender, EventArgs e)
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        var producto = negocio.LeerProducto(Convert.ToInt32(Request.QueryString["idProducto"]));

        var precio = producto.Precio / 100;
        var porcentaje = Convert.ToInt32(((TextBox)sender).Text);

        var resultado = precio * porcentaje;

        lblMontoFinanciar.Text = String.Format("{0:C}", resultado);

        lblMontoAbonoEfectivo.Text = String.Format("{0:C}", producto.Precio - resultado);
    }

    #endregion

    #region "Metodos Privados"

    private void IniciarSolicitud()
    {
        var solicitud = (SolicitudDeAnalisisCrediticio)Session[VariablesDeSesion.SolicitudActiva.ToString()];

        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

        solicitud.Beneficiario = (Cliente)negocio.Persona;


        var solicitudEnCurso = negocio.LeerSolicitudDeAnalisisEnCurso(solicitud.Beneficiario.Id);
        var ultimaSolicitudDenegada = negocio.LeerUltimaSolicitudDeAnalisisDenegada(solicitud.Beneficiario.Id);

        if (solicitudEnCurso != null || ultimaSolicitudDenegada != null)
            lblRechazoMarcaModelo.Text = String.Format(lblRechazoMarcaModelo.Text, solicitud.Producto.Marca.Nombre,
                                                       solicitud.Producto.Modelo.Nombre);

        if (solicitudEnCurso != null)
        {
            pnlRechazoSolicitud_ModalPopupExtender.Show();

            lblRechazoEnCurso.Text = string.Format(lblRechazoEnCurso.Text
                , solicitudEnCurso.Historial.Max(hist => hist.Fecha).ToShortDateString()
                , solicitudEnCurso.Producto.Marca.Nombre
                ,solicitudEnCurso.Producto.Modelo.Nombre);
            lblRechazoDenegado.Visible = false;

            lblRechazoEstado.Text = String.Format(lblRechazoEstado.Text, solicitudEnCurso.Estado.Nombre);
            lblRechazoMonto.Visible = false;

            lblRechazoPlazoMenor.Visible = false;
        }
        else if (ultimaSolicitudDenegada != null)
        {
            var ultimoRechazo = ultimaSolicitudDenegada.Historial.Max(hist => hist.Fecha);

            var montoMenosPorcentaje = ultimaSolicitudDenegada.Monto* (decimal) 0.9;

            if ((ultimoRechazo - DateTime.Now).Days > 30)
                negocio.GenerarSolicitudDeAnalisis(solicitud);
            else if(montoMenosPorcentaje < solicitud.Monto)
            {
                pnlRechazoSolicitud_ModalPopupExtender.Show();

                lblRechazoEnCurso.Visible = false;
                lblRechazoDenegado.Text = string.Format(lblRechazoDenegado.Text
                , ultimoRechazo.ToShortDateString()
                , ultimaSolicitudDenegada.Producto.Marca.Nombre
                , ultimaSolicitudDenegada.Producto.Modelo.Nombre);

                lblRechazoEstado.Visible = false;
                lblRechazoMonto.Text = String.Format(lblRechazoMonto.Text, ultimaSolicitudDenegada.Monto);

                lblRechazoPlazoMenor.Visible = false;
            }
            else
                negocio.GenerarSolicitudDeAnalisis(solicitud);
        }
        else
            negocio.GenerarSolicitudDeAnalisis(solicitud);
        
        if(solicitud.Estado.idEstado != IdEstadoAnalisis.AnalisisAutomatico)
            Response.Redirect(PaginaDeBusqueda);

        Session.Add(VariablesDeSesion.SolicitudActiva.ToString(), null);
    }

    [System.Web.Script.Services.ScriptMethod]
    [System.Web.Services.WebMethod(EnableSession=true)]
    public static AjaxControlToolkit.Slide[] GetSlides()
    {
        var imgSlide = new AjaxControlToolkit.Slide[3];

        var negocio = (NegocioFacade)HttpContext.Current.Session[VariablesDeSesion.NegocioFacade.ToString()];

        var producto = negocio.RecuperarEntidadEnEdicion<Producto>();
        if (producto != null)
        {
            int x = 0;
            foreach (var imagen in producto.Imagenes)
            {
                imgSlide[x++] = new AjaxControlToolkit.Slide(String.Format(@"~/ImageHandler.ashx?id={0}", imagen.Id), "", "");
            }
        }
        return (imgSlide);
    }

    private void CargarTiposFinanciacion()
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];
        HelperUI.CargarLista(ddlFinanciacion, negocio.LeerTiposFinanciacion(),
            "idTipo", "Nombre");
    }

    private void CargarConsultas(List<Consulta> consultas)
    {
        gvConsultas.DataSource = consultas.Where(consulta => consulta.EsPublica).ToList();
        gvConsultas.DataBind();
    }

    private void CargarProducto(Producto producto)
    {
        var negocio = (NegocioFacade)Session[VariablesDeSesion.NegocioFacade.ToString()];

        lblAnio.Text = producto.Anio.ToString();
        
        lblTitulo.Text = producto.Titulo;
        lblDescripcion.Text = producto.Descripcion;

        lblGastosAdmin.Text = String.Format("{0:C}", producto.GastosAdministrativos);
        lblGastosGest.Text = String.Format("{0:C}", producto.GastosDeGestoria);

        CargarConsultas(producto.Consultas);


        lblMarca.Text = negocio.LeerMarcas().Single(marca => marca.Id == producto.Marca.Id).Nombre;

        lblModelo.Text = negocio.LeerModelos(producto.Marca.Id).Single(modelo => modelo.Id == producto.Modelo.Id).Nombre;

        lblProductoParaComprar.Text = String.Format("{0} {1} {2}", lblMarca.Text, lblModelo.Text, producto.Anio);
        lblProductoParaComprarFinal.Text = lblProductoParaComprar.Text;

        lblPrecio.Text = String.Format("{0:C}", producto.Precio);
        lblValorVehiculo.Text = String.Format("{0:C}", producto.Precio);
        lblValorVehiculoFinal.Text = String.Format("{0:C}", producto.Precio);

        var x = 1;
        foreach (var prestacion in producto.Prestaciones)
        {
            var li = new HtmlGenericControl("li") {InnerText = prestacion.Descripcion};

            switch (x)
            {
                case 1:
                    ulPrestaciones1.Controls.Add(li);
                    x++;
                    break;
                case 2:
                    ulPrestaciones2.Controls.Add(li);
                    x++;
                    break;
                case 3:
                    ulPrestaciones3.Controls.Add(li);
                    x = 1;
                    break;
            }
        }

        lblCombustible.Text = negocio.LeerTiposCombustible().Single(combustible => combustible.idTipo == producto.TipoDeCombustible.idTipo).Nombre;
        lblFinanciacion.Text = negocio.LeerTiposFinanciacion().Single(tipoFin => tipoFin.idTipo == producto.TipoDeFinanciacion.idTipo).Nombre;
        lblTipo.Text = negocio.LeerTiposProducto().Single(tipo => tipo.idTipo == producto.TipoDeProducto.idTipo).Nombre;
        lblUso.Text = negocio.LeerUsosDeProducto().Single(uso => uso.idUso == producto.Uso.idUso).Nombre;
    }

    #endregion
}